class ESMeta(object):
    """
    自定义的EsMeta类，用来封装标签规则的属性信息，以方便后续使用

    属性:
        inType: 输入类型，如Elasticsearch
        esNodes: ES节点地址，格式为host:port
        esIndex: ES索引名称
        esType: ES文档类型
        selectFields: 需要查询的字段列表，逗号分隔
    """
    # 类属性定义及类型提示
    inType:str = None
    esNodes:str = None
    esIndex:str = None
    esType:str = None
    selectFields:str = None

    def __init__(self,inType,esNodes,esIndex,esType,selectFields):
        """
        初始化ESMeta对象

        参数:
            inType: 输入类型
            esNodes: ES节点地址
            esIndex: ES索引名称
            esType: ES文档类型
            selectFields: 需要查询的字段
        """
        self.inType = inType
        self.esNodes = esNodes
        self.esIndex = esIndex
        self.esType = esType
        self.selectFields = selectFields

    def __str__(self):
        """
        重写str魔术方法，提供更友好的对象字符串表示

        返回:
            格式化后的属性字符串，逗号分隔
        """
        return f'{self.inType},{self.esType},{self.esNodes},{self.esIndex},{self.selectFields}'

def ruleToESMeta(rule):
    """
    将标签规则字符串转换为ESMeta对象

    参数:
        rule: 标签规则字符串，格式为"key1=value1##key2=value2##..."

    返回:
        根据规则字符串创建的ESMeta对象

    处理逻辑:
        1. 按##分割规则字符串得到键值对列表
        2. 将每个键值对按=分割存入字典
        3. 使用字典解包方式创建ESMeta对象
    """
    # 分割规则字符串
    lists = rule.split("##")
    ruleDict = {}
    # 解析每个键值对
    for ruleKV in lists:
        kvStr = ruleKV.split("=")
        ruleDict[kvStr[0]] = kvStr[1]
    # 使用字典解包创建对象
    return ESMeta(**ruleDict)


if __name__ == '__main__':
    # 测试用例
    rule = "inType=Elasticsearch##esNodes=up01:9200##esIndex=tfec_tbl_logs##esType=_doc##selectFields=global_user_id,loc_url,log_time"
    # 转换规则字符串为ESMeta对象
    esMeta = ruleToESMeta(rule)
    # 测试ESMeta对象的功能
    # 1. 打印整个对象，会调用__str__方法返回格式化字符串
    print(esMeta)  # 调用__str__方法

    # 2. 分别打印对象的各个属性值
    print(esMeta.inType)        # 打印输入类型
    print(esMeta.esNodes)      # 打印ES节点地址
    print(esMeta.esIndex)      # 打印ES索引名称
    print(esMeta.esType)       # 打印ES文档类型
    print(esMeta.selectFields) # 打印查询字段列表

